package com.loop.netty.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * 自定义一个Handler，需要继承ChannelInboundHandlerAdapter（netty规定）
 *
 * @author zhangxiaolu
 * @since 2023-09-10 22:11
 */
//public class NettyServerHandler extends ChannelInboundHandlerAdapter {
public class SimpleNettyServerHandler extends SimpleChannelInboundHandler<StudentPojo.Student> {

    // 读取数据事件（这里我们可以读取客户端发送的消息）

    /**
     * @param ctx 上下文对象，含有管道pipeline，通道channel，地址
     * @param msg 就是客户端发送的数据 默认是Object
     * @throws Exception
     */
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        // 读取从客户端发送的StudentPojo.Student对象
//        StudentPojo.Student student = (StudentPojo.Student) msg;
//        System.out.println("客户端发送的数据 id：" + student.getId() + " name：" + student.getName());
//    }
    @Override
    public void channelRead0(ChannelHandlerContext ctx, StudentPojo.Student msg) throws Exception {
        // 读取从客户端发送的StudentPojo.Student对象
//        StudentPojo.Student student = (StudentPojo.Student) msg;
        System.out.println("客户端发送的数据 id：" + msg.getId() + " name：" + msg.getName());
    }

    // 数据读取完毕事件
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // write和flush方法的合并，将数据写入到缓存，并刷新
        // 刷新是必须的，否则数据不会被写入到Socket通道
        // 刷新之后，数据才能发送到客户端
        // 一般讲，我们对这个发送的数据进行编码
        System.out.println("NettyServerHandler.channelReadComplete()");
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端~2", CharsetUtil.UTF_8));

    }

    // 出现异常事件
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("NettyServerHandler.exceptionCaught()");
        ctx.close();
    }
}
